#ifndef _MB_PROT_H_
#define _MB_PROT_H_

#include "mb_type.h"

/* 收到的数据帧类型 */
typedef enum
{
    PROT_FORMAT_DATA = 0, /* master 发送的 普通数据帧 */
    PROT_FORMAT_EOT,      /* master 发送的 是 结束帧 */
    PROT_FORMAT_CAN,      /* master 发送的 是 取消发送帧 */
    PROT_FORMAT_UNKNOWN,  /* master 发送的帧无法解析出类型 */
} PROT_FORMAT_TYPE;

/* 数据协议的行为状态 */
typedef struct PROT_ACTION_STATUS_STR
{
    MB_STATUS is_start_recv;   /* 是否开始接收 */
    MB_STATUS is_requested;    /* slave 是否已要求传输数据 */
    MB_STATUS is_respond;      /* 是否收到 master 的回应 (发来数据) */
    MB_STATUS is_geted;        /* 数据是否被 salve 取走 */
} prot_action_status, *prot_action_status_t;

/* 帧协议变量值 */
typedef struct PROT_FORMAT_VAR_STR
{
    uint8_t  head;               /* 一般是固定的帧头 */
    uint8_t  new_index;          /* 新接收成功的帧序号 */
    uint16_t payload_len;        /* 有效数据个数 */
} prot_format_var, *prot_format_var_t;

/* PROT 私有数据 */
typedef struct PROT_PRVT_STR
{
    PROT_SELECT        cursel;                           /* 当前协议类的选择 */
    PROT_SELECT        sel_history[PROT_SELECT_MAX_NBR]; /* 协议选择历史记录 */
    prot_format_var    format_var;                       /* 帧协议变量值 */
    cmc_op *           carrier;                          /* 数据通道操作 */
    uint8_t            tx_buf[PROT_TXBUF_MAX_LEN];       /* 数据发送缓冲区 */
    uint8_t            rx_buf[PROT_RXBUF_MAX_LEN];       /* 数据接收缓冲区 */
    mb_buf_attr        parsed_buf;                       /* 解析后的数据的缓冲区 */
    mb_buf_attr *      p_parsed_buf;                     /* 解析后的数据的缓冲区 (指针形式) */
    prot_action_status action_status;                    /* 数据协议的行为状态 */
    PROT_FORMAT_TYPE   CUR_FORMAT_TYPE;                  /* 当前收到的数据帧类型 */
} prot_prvt, *prot_prvt_t;

/* 注册 prot 协议操作 */
prot_op_t mb_prot_op_register(PROT_SELECT sel);

#endif
